// ==UserScript==
// @name [🔰 - Sign ]
// @version 0.2.2
// @description 集合各种平台签到,需要网页手动登录网站;每天在 1-23 点运行一次
// @author .Seven
// @crontab * 1-23 once * *
// @grant GM_xmlhttpRequest
// @grant GM_notification
// @grant GM_log
// @grant GM_getValue
// @exportCookie domain=.juejin.cn
// @exportValue 掘金.aid,掘金.uuid,掘金.msToken
// @connect bbs.binmt.cc
// @connect www.iculture.cc
// @connect www.ruike1.com
// @connect api.live.bilibili.com
// @connect bbs.kanxue.com
// @connect bbs.125.la
// @connect bbs.266.la
// @connect bbs.tampermonkey.net.cn
// @connect www.52pojie.cn
// @connect api.juejin.cn
// @license GPL
// @cloudCat
// @background
// ==/UserScript==
/* ==UserConfig==
掘金:
aid:
title: aid
description: 请在签到页面上使用开发者工具抓取aid,可以搜索check_in_rules请求查看
uuid:
title: uuid
description: 请在签到页面上使用开发者工具抓取aid,可以搜索check_in_rules请求查看
msToken:
title: msToken
description: 请在签到页面上使用开发者工具抓取msToken,可以搜索check_in_rules请求查看
==/UserConfig== */
function Sign_template() {
var homeUrl = '',
signUrl = '',
obj = Object.assign({}, template_Objs),
msg = '',
labels = 'error',
title = ''
msg = `${title}🟢重复签到`
msg = `${title}🟢签到成功`
msg = `${title}💢未知错误,请查看日志响应信息`
obj.url = homeUrl
response(obj, title).then(xhr => {
// xhr 的一些处理
GM_notification(msg)
GM_log(msg, labels)
})
}
var template_Objs = {
url: 0,
data: 0,
method: 0,
headers: 0,
responseType: 0,
};
var request = (paramsObj = {}) => new Promise((resolve, reject) => {
for (const key in paramsObj) if (!paramsObj[key]) delete paramsObj[key] // 剔除空值
var defaultObj = {
method: 'get',
onload: response => resolve(response), // 请求成功完成时触发
onerror: () => reject('网络错误') // 请求错误时触发
}
Object.assign(defaultObj, paramsObj) // 合并
GM_xmlhttpRequest(defaultObj)
})
var response = (obj, title) => new Promise((resolve, reject) => {
request(obj)
.then(xhr => resolve(xhr))
.catch(() => {
msg = `${title}❌访问失败,网络错误`
GM_notification(msg)
GM_log(msg, 'error')
reject(msg)
})
})
var parseDom = (str, contentType) => {
let mimeType = contentType ? contentType.split(';').shift() : 'text/html';
switch (mimeType) {
case 'text/html':
case 'text/xml':
case 'application/xml':
case 'application/xhtml+xml':
case 'image/svg+xml':
break;
default:
mimeType = 'text/html';
}
return new DOMParser().parseFromString(str, mimeType);
}
!function main() {
Sign_bilibili() // bilibili
Sign_kanxue() // 看雪论坛
Sign_DSU() // 精易论坛 | 派生社区 | 油猴中文网
Sign_52pj() // 52pj
Sign_MT() // MT论坛
Sign_juejin() // 掘金论坛:签到、抽取、收集Bug
// Sign_Pig() // 猪猪资源网站
Sign_ruike() // 瑞客资源网站
}()
function Sign_ruike() {
var signUrl = 'https://www.ruike1.com/k_misign-sign.html?operation=qiandao&format=global_usernav_extra&formhash=f9093311&inajax=1&ajaxtarget=k_misign_topb',
obj = Object.assign({}, template_Objs),
msg = '',
labels = 'error',
title = '瑞客论坛'
obj.url = signUrl
response(obj, title).then(xhr => {
if (xhr.response.includes(`alt="今日已签"`)) {
msg = `${title}🟢签到成功`
labels = "info"
} else if (xhr.response.includes("CDATA[今日已签]")) {
msg = `${title}🟢重复签到`
labels = "info"
} else {
msg = `${title}💢未知错误,请查看日志响应信息`
GM_log(`${title}💢未知错误 响应信息: ${xhr.response}`, 'warn')
}
GM_notification(msg)
GM_log(msg, labels)
})
}
function Sign_Pig() {
var signUrl = 'https://www.iculture.cc/wp-admin/admin-ajax.php',
obj = Object.assign({}, template_Objs),
msg = '',
labels = 'error',
title = 'FancyPing'
// msg = `${title}🟢重复签到`
// msg = `${title}🟢签到成功`
// msg = `${title}💢未知错误,请查看日志响应信息`
obj.url = signUrl
obj.method = "POST"
obj.responseType = "json"
obj.data = obj2FormData({ action: "user_checkin" }) // 表单提交数据
obj.headers = {
'referrer': "https://www.iculture.cc/user/balance",
'Content-Type': 'application/x-www-form-urlencoded'
}
response(obj, title).then(xhr => {
if (xhr?.status == 200) {
if (xhr?.response?.errpr) {
msg = `${title}🟢${xhr?.response?.msg}` // "msg": "签到成功! 积分+30 经验值+40",
labels = "info"
} else {
msg = `${title}🟢重复签到` // { "error": true, "ys": "info", "msg": "今日已签到" }
labels = "info"
}
} else {
msg = `${title}💢未知错误,请查看日志响应信息`
GM_log(`${title}💢未知错误 响应信息: ${JSON.stringify(xhr.response)}`, 'warn')
}
GM_notification({
text: msg,
image: 'https://www.iculture.cc/favicon.ico'
})
GM_log(msg, labels)
})
}
/**
* 对象转表单提交数据 a=1&b=2
*/
function obj2FormData(obj) {
var str = ''
Object.keys(obj).forEach(key => {
var value = `${key}=${obj[key]}`
str == '' ?
str = value :
str += `&${value}`
});
// console.log(str);
return str
}
function Sign_bilibili() {
var SignliveUrl = 'https://api.live.bilibili.com/sign/doSign', // 直播签到
coinUrl = 'https://api.bilibili.com/x/web-interface/nav/stat', // 头像获取硬币❓
obj = Object.assign({}, template_Objs),
msg = '',
labels = 'error',
title = '哔哩哔哩'
// 直播签到
obj.url = SignliveUrl
obj.responseType = 'json'
response(obj, title).then(xhr => {
switch (xhr.response.code) {
case 0:
msg = `${title}🟢签到成功`;
labels = 'info';
break;
case 1011040:
msg = `${title}🟢直播重复签到`; // {'code':1011040,'message':'今日已签到过,无法重复签到','ttl':1,'data':null}
labels = 'info';
break;
case -101:
msg = `${title}签到失败❌账号未登录`;
break
case 1011038: // {"code":1011038,"message":"操作太快","ttl":1,"data":null}
msg = `${title}签到失败❌操作太快`;
default:
msg = `${title}💢未知状态码,请查看日志响应信息`
GM_log(`${title}💢未知状态码响应信息: ${JSON.stringify(xhr.response)}`, 'warn')
}
GM_notification(msg)
GM_log(msg, labels)
})
}
function Sign_kanxue() {
var homeUrl = 'https://bbs.kanxue.com/',
signUrl = 'https://bbs.kanxue.com/user-signin.htm', // 论坛签到
obj = Object.assign({}, template_Objs),
msg = '',
labels = 'error',
title = '看雪论坛'
// 访问主页获取 token
obj.url = homeUrl
response(obj).then(xhr => {
let token = parseDom(xhr.response).querySelector(`meta[name='csrf-token']`).content
obj.url = signUrl
obj.method = 'post'
obj.responseType = 'json'
obj.data = { csrf_token: token }
response(obj, title).then(xhr => {
switch (xhr.response.code) {
case '0': // {'code': '0','message': 3}
msg = `${title}🟢签到成功获取雪币:${xhr.response.message}`
labels = 'info';
break
case '-1': // {'code': '-1','message': '您今日已签到成功'}
labels = 'info';
msg = `${title}🟢重复签到`
labels = 'info';
break
default:
msg = `${title}💢未知状态码,请查看日志响应信息`
GM_log(`${title}💢未知状态码响应信息: ${JSON.stringify(xhr.response)}`, 'warn')
}
GM_notification(msg)
GM_log(msg, labels)
})
})
}
function Sign_DSU() {
Sign('https://bbs.125.la/',
'https://bbs.125.la/plugin.php?id=dsu_paulsign:sign&operation=qiandao&infloat=1',
'精易论坛')
// Sign('https://bbs.266.la/plugin.php?id=dsu_paulsign:sign',
// 'https://bbs.266.la/plugin.php?id=dsu_paulsign:sign&operation=qiandao&infloat=1',
// '派生社区')
Sign('https://bbs.tampermonkey.net.cn',
'https://bbs.tampermonkey.net.cn/plugin.php?id=dsu_paulsign:sign&operation=qiandao&infloat=1&inajax=1',
'油猴中文网')
function Sign(homeUrl, signUrl, title) {
var obj = Object.assign({}, template_Objs),
msg = '',
labels = 'error'
obj.url = homeUrl
response(obj, '${title}').then(xhr => {
let formhash = parseDom(xhr.response).querySelector(`input[name='formhash']`).value
var data = {
formhash: formhash,
submit: '1',
targerurl: '',
todaysay: '',
qdxq: 'kx', // 表情开心
}
obj.url = signUrl
obj.data = obj2FormData(data) // 转表单数据
obj.method = 'post'
obj.responseType = 'json'
obj.headers = { 'content-type': 'application/x-www-form-urlencoded' } // 表单协议头
response(obj, title).then(xhr => {
if (title === '油猴中文网') {
if (xhr.responseText.includes("您今日已经签到")) {
msg = `${title}🟢重复签到`
labels = 'info';
} else if (xhr.responseText.includes("签到成功")) {
const regex = /"c">(.*?) {
const regex = /dynamicurl\|\/(.*?)\|/g
regex.exec(xhr.responseText)
obj.url = `https://www.52pojie.cn/${RegExp.$1}?wzwscspd=MC4wLjAuMA==` // 签到 url
obj.headers = { referer: 'https://www.52pojie.cn/' }
response(obj, '52破解').then(xhr => {
if (xhr.responseText.includes('任务已完成')) {
msg = `${title}🟢签到成功`
labels = 'info'
} else if (xhr.responseText.includes('本期您已申请过此任务')) {
msg = `${title}🟢重复签到`
labels = 'info'
} else {
msg = `${title}💢未知错误,请查看日志响应信息`
GM_log(`${title}💢未知状态码响应信息: ` + JSON.stringify(xhr.response), 'warn')
}
GM_notification(msg)
GM_log(msg, labels)
})
})
}
function Sign_MT() {
var homeUrl = 'https://bbs.binmt.cc/',
obj = Object.assign({}, template_Objs),
msg = '',
labels = 'error',
title = 'MT论坛'
obj.url = homeUrl
response(obj, title).then(xhr => {
let formhash = parseDom(xhr.response).querySelector(`input[name='formhash']`).value
obj.url = `https://bbs.binmt.cc/k_misign-sign.html?operation=qiandao&format=button&formhash=${formhash}&inajax=1&ajaxtarget=midaben_sign`
response(obj, title).then(xhr => {
if (xhr.response.includes("今日已签")) {
msg = `${title}🟢重复签到` //
labels = 'info'
} else if (xhr.response.includes("签到成功")) {
/* xml version = "1.0" encoding = "utf-8" ?>
已签到
连续4天
]]>
*/
const regex = /con">(.*?) {
response(obj, title) // 文章访问
}, Math.floor(Math.random() * (1000 - 5000 + 1) + 5000)) // 延时访问 1-5s
}
}
function sign(signUrl) {
obj = Object.assign({}, template_Objs)
obj.url = signUrl
obj.data = {}
obj.headers = headers
obj.responseType = "json"
obj.method = "post"
response(obj, title).then(xhr => {
switch (xhr.response.err_no) {
case 0:
// {"err_no":0,"err_msg":"success","data":{"incr_point":512,"sum_point":762}}
let incr_point = xhr?.response?.data?.incr_point // 签到获取矿石
let sum_point = xhr?.response?.data?.sum_point // 当前账户矿石
msg = `${title}🟢签到成功 | ${sum_point}(+${incr_point})`
labels = "info"
break
case 15001:
// {err_no: 15001, err_msg: '您今日已完成签到,请勿重复签到', data: null}
msg = `${title}🟢重复签到`
labels = "info"
break
default:
msg = `${title}💢未知状态码,请查看日志响应信息`
GM_log(`${title}💢未知状态码响应信息: ` + JSON.stringify(xhr.response), 'warn')
}
GM_notification(msg)
GM_log(msg, labels)
})
labels = 'error'
}
async function lucky(luckyfreeCountUrl, luckyUrl) {
obj = Object.assign({}, template_Objs)
obj.url = luckyfreeCountUrl
obj.headers = headers
obj.responseType = "json"
response(obj, title).then(async xhr => {
var free_count = xhr?.response?.data?.free_count ?? 0
if (free_count > 0) { // 存在免费抽奖次数
obj.url = luckyUrl
obj.method = "post"
obj.data = JSON.stringify({})
var luckyXHR = await response(obj, title)
/* "response": {
"err_no": 0,
"err_msg": "success",
"data": {
"id": 19,
"lottery_id": "6981716980386496552",
"lottery_name": "85矿石",
"lottery_type": 1,
"lottery_image": "https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/32ed6a7619934144882d841761b63d3c~tplv-k3u1fbpfcp-no-mark:0:0:0:0.image",
"lottery_desc": "",
"lottery_cost": 0,
"lottery_reality": 2,
"history_id": "7190702028153159713",
"total_lucky_value": 30,
"draw_lucky_value": 10
}
}*/
console.log(luckyXHR)
msg = `${title}❤抽奖成功 | 奖品(${luckyXHR?.response?.data?.lottery_name}) 幸运值(${luckyXHR?.response?.data?.total_lucky_value})`
labels = "info"
} else {
msg = `${title}💔无抽免费奖次数`
labels = "info"
}
GM_notification(msg);
GM_log(msg, labels)
})
labels = 'error'
}
async function bugfix(bugCompetitionIdUrl, bugCountUrl, bugInfoUrl, bugUrl) {
// 获取 bug 场信息
obj = Object.assign({}, template_Objs)
obj.url = bugCompetitionIdUrl
obj.data = JSON.stringify({ competition_id: "" })
obj.headers = headers
obj.responseType = "json"
obj.method = "POST"
var xhr = await response(obj, title)
var competition_name = xhr?.response?.data?.competition_name
var competition_id = xhr?.response?.data?.competition_id
if (!competition_id) {
msg = `competition_id 获取失败(${xhr?.response})`
GM_notification(msg)
GM_log(msg, labels)
return
}
// 获取未消除 bug 数
obj.url = bugCountUrl
obj.data = JSON.stringify({ competition_id: competition_id })
xhr = await response(obj, title)
var bugCounts = xhr?.response?.data?.user_own_bug
console.log("未消除bug数:", bugCounts)
// 获取 bug 信息
obj.url = bugInfoUrl
obj.data = JSON.stringify({})
xhr = await response(obj, title)
var bugList = xhr?.response?.data
// console.log("bugList:", bugList)
// 消除 bug
var successCount = 0; // 成功消除 bug 数
var tempStr = ""
for (const element of bugList) {
var bug_time = element.bug_time
var bug_type = element.bug_type
console.log(bug_time, bug_type)
obj.url = bugUrl
obj.data = JSON.stringify({ bug_time: bug_time, bug_type: bug_type })
xhr = await response(obj, title)
switch (xhr?.response.err_on) {
// { "err_no": 0, "err_msg": "success", "data": null }
// { "err_no": 20003, "err_msg": "bug not exsit", "data": null }
// { "err_no": 20004, "err_msg": "bug already collect", "data": null }
case 0:
successCount += 1
GM_log(`${title}💭bug 消除: ` + JSON.stringify(xhr?.response?.err_msg), 'info')
break
case 20003:
GM_log(`${title}💢bug 消除: ` + JSON.stringify(xhr?.response?.err_msg), 'info')
break
case 20004:
GM_log(`${title}💢bug 消除: ` + JSON.stringify(xhr?.response?.err_msg), 'info')
break
default:
msg = `${title}💢未知状态码,请查看日志响应信息`
GM_log(`${title}💢未知状态码响应信息: ` + JSON.stringify(xhr?.response), 'warn')
GM_notification(msg)
}
tempStr == "" ? tempStr = xhr.response.err_msg : tempStr += "\n" + xhr.response.err_msg
}
msg = `${title}Bug Fix-${competition_name}(${successCount}/${bugList.length})\n消除日志:${tempStr}`
GM_notification(msg)
GM_log(msg, "info")
}
}